package com.gitee.feizns.explore.data_structure.linked_list.singly.ring;

import java.util.HashSet;
import java.util.Set;

/**
 * 给定一个链表，判断链表中是否有环。
 * <p>
 * 为了表示给定链表中的环，我们使用整数 pos 来表示链表尾连接到链表中的位置（索引从 0 开始）。 如果 pos 是 -1，则在该链表中没有环。
 *
 * @author feizns
 * @since 2019/9/29
 */
public class Ring1 {

    public static void main(String[] args) {
        System.out.println(quickAndSlowHasCycle(ListNode.create()));
    }

    public static boolean hasCycle(ListNode head) {
        Set<ListNode> ret = new HashSet<ListNode>();
        ListNode last = head;
        while ( !(ret.contains(last)) ) {
            if ( last == null )
                return false;
            ret.add(last);
            last = last.next;
        }
        return true;
    }

    public static boolean quickAndSlowHasCycle(ListNode head) {
        ListNode step1 = head;
        ListNode step2 = head;

        while ( true ) {
            step2 = step2.next;
            if ( step2 == null )
                return false;

            step2 = step2.next;
            if ( step2 == null )
                return false;

            step1 = step1.next;
            if ( step1 == step2 )
                return true;
        }
    }

}
